/*
 * Quercia Luciano
 * Algoritmi e Strutture Dati
 * a.a. 2009-10
 */


#ifndef DIZIONARIO_H_
#define DIZIONARIO_H_

#include "insieme/insieme.h"

template<class T>
class Dizionario{
public:
	Dizionario();
	Dizionario(int);
	~Dizionario();

	bool vuoto();
	bool appartiene(const T& );
	void inserisci(const T&);
	void cancella(const T&) throw (char const *) ;
	unsigned int dimensione() { return nNodi; }
	unsigned int hash(const T&) throw (char const *) ;

	//personalizzati
	void print();

private:
	unsigned int sizeMax;
	unsigned int nNodi;
	Insieme<T>* table;
};


template<class T>
Dizionario<T>::Dizionario():sizeMax(26) {
	nNodi = 0;
	table = new Insieme<T>[sizeMax];
}

template<class T>
Dizionario<T>::Dizionario(int n):sizeMax(n) {
	nNodi = 0;
	table = new Insieme<T>[sizeMax];
}

template<class T>
Dizionario<T>::~Dizionario(){
	for (unsigned int i=0; i<sizeMax; i++) {
		table[i].~Insieme();
	}
}


template<class T>
bool Dizionario<T>::vuoto(){
	return( nNodi==0 );
}

template<class T>
bool Dizionario<T>::appartiene( const T& elemento ){
	return table[ hash(elemento) ].appartiene(elemento);
}

template<class T>
void Dizionario<T>::inserisci( const  T& elemento ){
	if ( !appartiene( elemento ) ) {
		table[ hash(elemento) ].inserisci( elemento );
		nNodi++;
	} else {}
}

template<class T>
void Dizionario<T>::cancella( const T& elemento ) throw (char const *) {
	if ( appartiene( elemento ) ) {
		table[ hash(elemento) ].cancella(elemento) ;
		nNodi--;
	} else
		throw "Elemento non presente nel Dizionario" ;
}


template<class T>
unsigned int Dizionario<T>::hash(const T& elemento) throw (char const *) {
	//REALIZZAZIONE PER STRINGHE
	char c = elemento[0];
	int h;
	if ((c>=65) && (c<=90))
		h = c - 65;
	else if ((c>=97) && (c<=122))
		h = c - 97;
	else
		throw "Impossibile mettere in relazione l'elemento al dizionario.";
	return h;
}


template<class T>
void Dizionario<T>::print() {
	Insieme<T> set;
	for (unsigned int i=0; i<sizeMax;i++) {
		set = set.unione( table[i] );
	}
	set.print();
}


#endif /* DIZIONARIO_H_ */
